// 给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。
// 有效字符串需满足：
// 左括号必须用相同类型的右括号闭合。
// 左括号必须以正确的顺序闭合。
// 每个右括号都有一个对应的相同类型的左括号。

// 示例 1：
// 输入：s = "()"
// 输出：true

// 示例 2：
// 输入：s = "()[]{}"
// 输出：true

// 示例 3：
// 输入：s = "(]"
// 输出：false

// 示例 4：
// 输入：s = "([])"
// 输出：true

// 示例 5：
// 输入：s = "([)]"
// 输出：false

// 提示：
// 1 <= s.length <= 104
// s 仅由括号 '()[]{}' 组成

function isValid(s) {
  // 用栈存储
  const stack = [];
  // 存储括号的映射关系
  const pairs = {
    "(": ")",
    "[": "]",
    "{": "}",
  };

  // 遍历字符串
  for (const char of s) {
    // 如果是左括号，入栈
    if (pairs[char]) {
      stack.push(char);
    } else {
      // 如果是右括号，判断栈顶元素是否为对应的左括号
      const top = stack.pop();
      if (pairs[top] !== char) {
        return false;
      }
    }
  }

  // 如果栈为空，说明所有左括号都有对应的右括号
  return stack.length === 0;
}
